ARD2  1.00 for Rev B. Hardware
Airbag Reference Demonstrator using MPC5604P
MMA68xx.h
Go to the documentation of this file.
00001 
00018 #ifndef _MMA68XX_H
00019 #define _MMA68XX_H
00020  
00021 /*
00022  **************************************************************
00023  * Defines, Macros and Typedefs 
00024  **************************************************************/
00025 /*** Constant Macros ***/
00026 /* Default Yes and No defines */
00027 #ifndef TRUE
00028  #define TRUE (1u)
00029 #endif
00030 #ifndef CLEAR
00031  #define CLEAR (0u)
00032 #endif
00033 #ifndef BITS_IN_NIBBLE
00034  #define BITS_IN_NIBBLE (4u)
00035 #endif
00036 #ifndef BITS_IN_BYTE
00037  #define BITS_IN_BYTE (8u)
00038 #endif
00039 #ifndef BYTES_IN_16
00040  #define BYTES_IN_16  (2u)
00041 #endif
00042 #ifndef BYTES_IN_32
00043  #define BYTES_IN_32  (4u)
00044 #endif
00045 #ifndef BIT_DEFINITION
00046  #define BIT_DEFINITION
00047  #define BIT0  (1u << 0u)
00048  #define BIT1  (1u << 1u)
00049  #define BIT2  (1u << 2u)
00050  #define BIT3  (1u << 3u)
00051  #define BIT4  (1u << 4u)
00052  #define BIT5  (1u << 5u)
00053  #define BIT6  (1u << 6u)
00054  #define BIT7  (1u << 7u)
00055  #define BIT8  (1u << 8u)
00056  #define BIT9  (1u << 9u)
00057  #define BIT10 (1u << 10)
00058  #define BIT11 (1u << 11)
00059  #define BIT12 (1u << 12)
00060  #define BIT13 (1u << 13)
00061  #define BIT14 (1u << 14)
00062  #define BIT15 (1u << 15)
00063  #define BIT16 (1u << 16)
00064  #define BIT17 (1u << 17)
00065  #define BIT18 (1u << 18)
00066  #define BIT19 (1u << 19)
00067  #define BIT20 (1u << 20)
00068  #define BIT21 (1u << 21)
00069  #define BIT22 (1u << 22)
00070  #define BIT23 (1u << 23)
00071  #define BIT24 (1u << 24)
00072  #define BIT25 (1u << 25)
00073  #define BIT26 (1u << 26)
00074  #define BIT27 (1u << 27)
00075  #define BIT28 (1u << 28)
00076  #define BIT29 (1u << 29)
00077  #define BIT30 (1u << 30)
00078  #define BIT31 (1u << 31)
00079 #endif
00080 
00081 
00082 /* Register Addresses for the device */
00083 #define MMA6800_MEMORY_MAP_SIZE     (0x18u)
00084 #define MMA6800_SN0                 (0x00u << 8u)
00085 #define MMA6800_SN1                 (0x01u << 8u)
00086 #define MMA6800_SN2                 (0x02u << 8u)
00087 #define MMA6800_SN3                 (0x03u << 8u)
00088 #define MMA6800_STDEFL_X            (0x04u << 8u)
00089 #define MMA6800_STDEFL_Y            (0x05u << 8u)
00090 #define MMA6800_FCTCFG_X            (0x06u << 8u)
00091 #define MMA6800_FCTCFG_Y            (0x07u << 8u)
00092 #define MMA6800_PN                  (0x08u << 8u)
00093 #define MMA6800_RESERVED3           (0x09u << 8u)
00094 #define MMA6800_DEVCTL              (0x0Au << 8u)
00095 #define MMA6800_DEVCFG              (0x0Bu << 8u)
00096 #define MMA6800_DEVCFG_X            (0x0Cu << 8u)
00097 #define MMA6800_DEVCFG_Y            (0x0Du << 8u)
00098 #define MMA6800_ARMCFGX             (0x0Eu << 8u)
00099 #define MMA6800_ARMCFGY             (0x0Fu << 8u)
00100 #define MMA6800_ARMT_XP             (0x10u << 8u)
00101 #define MMA6800_ARMT_YP             (0x11u << 8u)
00102 #define MMA6800_ARMT_XN             (0x12u << 8u)
00103 #define MMA6800_ARMT_YN             (0x13u << 8u)
00104 #define MMA6800_DEVSTAT             (0x14u << 8u)
00105 #define MMA6800_COUNT               (0x15u << 8u)
00106 #define MMA6800_OFF_CORR_X          (0x16u << 8u)
00107 #define MMA6800_OFF_CORR_Y          (0x17u << 8u)
00108 
00109 #define MMA6800_PCM_ON              (0x10u)
00110 #define MMA6800_ARM_MOVEAVGHIGH     (0x20u)
00111 #define MMA6800_ARM_MOVEAVGLOW      (0x21u)
00112 #define MMA6800_ARM_COUNTHIGH       (0x30u)
00113 #define MMA6800_ARM_COUNTLOW        (0x31u)
00114 #define MMA6800_ARM_UNFILTHIGH      (0x40u)
00115 #define MMA6800_ARM_UNFILTTLOW      (0x41u)
00116 
00117 /* Register related */
00118 #define MMA6800_READ_REGISTER       (0x00u)
00119 #define MMA6800_WRITE_REGISTER      (0x40u)
00120 
00121 /* Accel reading function masks */
00122 #define MMA6800_READ_X               (BIT0)
00123 #define MMA6800_READ_Y               (BIT1)
00124 
00125 /* Accel reading settings */
00126 #define MMA6800_READ_ACCEL           (0x2000u)
00127 #define MMA6500_READ_ACCEL           (0x2008u)
00128 #define MMA6800_X_AXIS               (0x0000u)
00129 #define MMA6800_Y_AXIS               (0x4000u)
00130 #define MMA6800_ARM_ENABLE           (0x0002u)
00131 #define MMA6800_ARM_DISABLE          (0x0000u)
00132 #define MMA6800_SIGNED_DATA          (0x0000u)
00133 #define MMA6800_UNSIGNED_DATA        (0x0004u)
00134 #define MMA6800_OFFSET_CANCELLED     (0x0000u)
00135 #define MMA6800_RAW_DATA             (0x1000u)
00136 
00137 /* Transfer mode definitions for MMA6800 */
00138 #define MMA6800_TRANSFER_MODE_IS_SCHEDULED (0u)
00139 #define MMA6800_TRANSFER_MODE_IS_IMMEDIATE (1u)
00140 
00141 /* Error bits */
00142 #define MMA6800_REGISTER_RESP_SIGNATURE (BIT11 | BIT10)
00143 #define MMA6800_ACCEL_READING           (0x01u)
00144 #define MMA6800_REGISTER_RESPONSE       (0x02u)
00145 #define MMA6800_TIMED_OUT               (0x04u)
00146 #define MMA6800_INVALID_PARITY          (0x08u)
00147 #define MMA6800_INVALID_MEMORY_LOCATION (0x10u)
00148 #define MMA6800_ERROR_DATAGRAM          (0x20u)
00149 #define MMA6800_ERROR_ACCEL             (0x40u)
00150 
00151 /* Mesquite or Sycamore */
00152 #define MESQUITE 1
00153 #define SYCAMORE 2
00154 
00155 /* To filter out acceleration */
00156 #define MMA6800_RAW_ACCEL_MASK          (0x03FFu)
00157 #define MMA6500_RAW_ACCEL_MASK          (0xC3FFu)
00158 
00159 /* Global buffer size */
00160 #define MMA6800_GLOBAL_BUFFER_SIZE      (30u)
00161 
00162 /* Error codes */
00163 #define MMA6800_ERROR_MASK         ((uint16_t)0x6000u)
00164 
00165 #define MMA6800_MSG_BUFFER_SIZE     50
00166 
00167 /* This define counts how many elements are needed for */
00168 /* an accel response given the number of elements sent */
00169 /* as a request                                        */
00170 #define RAW_MMA_ACCEL_ARRAY_SIZE    3u
00171 
00172 /*** Function Macros ***/
00173 #ifndef N_ELEMENTS
00174  #define N_ELEMENTS(X)           (sizeof(X)/sizeof(*(X)))
00175 #endif
00176 
00177 /*** Enums ***/
00178 
00179 /*** TypeDefs ***/
00180 
00181 /*
00182  **************************************************************
00183  * Declarations 
00184  **************************************************************/
00185 /*** Extern ***/
00186 extern const uint16_t cau16MMA6800ReadAllRegisters[];
00187 extern const uint16_t cau16MMA6800Reset[];
00188 extern const uint16_t cau16MMA6800PerformAccelReading[];
00189 extern const uint16_t cau16MMA6500PerformAccelReading[];
00190 extern uint8_t (* const u8pfnMMA6800BatchOp[])(const uint8_t cu8DSPIInstance,
00191     const uint8_t cu8ChipSelect,
00192     const uint16_t* pu16DataToSend,
00193     uint16_t* pu16UnfilteredDataReceived,
00194     uint8_t u8Size);
00195 /*** Globals ***/
00196 extern uint8_t gau8MMA6800GlobalResult[MMA6800_GLOBAL_BUFFER_SIZE];
00197 /*** Static Globals ***/
00198 /*
00199  **************************************************************
00200  * Function Prototypes 
00201  **************************************************************/
00202 /*
00203  ******************************************************************************
00204  *
00205  * Function:          u8fnMMA6800ReadRegister()
00206  *
00207  */
00230 uint8_t u8fnMMA6800ReadRegister(const uint8_t cu8DSPIInstance,
00231                                 const uint8_t cu8ChipSelect,
00232                                 const uint8_t cu8TransferMode,
00233                                 uint16_t u16Register,
00234                                 uint16_t* pu16DataRead);
00235 /*
00236  ******************************************************************************
00237  *
00238  * Function:          u8fnMMA6800WriteRegister()
00239  *
00240  */
00264 uint8_t u8fnMMA6800WriteRegister(const uint8_t cu8DSPIInstance,
00265                                  const uint8_t cu8ChipSelect,
00266                                  const uint8_t cu8TransferMode,
00267                                  uint16_t u16Register,
00268                                  uint8_t u8ValueToWrite, 
00269                                  uint16_t* pu16DataRead);
00270 /*
00271  ******************************************************************************
00272  *
00273  * Function:          u8fnMMA6800Reset()
00274  *
00275  */
00288 uint8_t u8fnMMA6800Reset(const uint8_t cu8DSPIInstance,
00289                          const uint8_t cu8ChipSelect, 
00290                          const uint8_t cu8TransferMode);
00291 /*
00292  ******************************************************************************
00293  *
00294  * Function:          u8fnMMA6800ReadAccel()
00295  *
00296  */
00326 uint8_t u8fnMMA6800ReadAccel(const uint8_t cu8DSPIInstance,
00327                              const uint8_t cu8ChipSelect,
00328                              const uint8_t cu8TransferMode,
00329                              const uint8_t cu8Axis,
00330                              const uint8_t cu8ConfigMemory,
00331                              uint16_t* pu16AccelResults, 
00332                              const uint8_t cu8Accel);
00333 /*
00334  ******************************************************************************
00335  *
00336  * Function:          u8fnMMA6800ExtractRegisterResponse()
00337  *
00338  */
00348 uint8_t u8fnMMA6800ExtractRegisterResponse(const uint16_t* pu16RawResponse, \
00349                                            uint8_t* pu8Response,            \
00350                                            uint8_t u8Size);
00351 /*
00352  ******************************************************************************
00353  *
00354  * Function:          u8fnMMA6800ExtractAccelResponse()
00355  *
00356  */
00368 uint8_t u8fnMMA6800ExtractAccelResponse(const uint16_t* pu16RawResponse, 
00369                                         uint16_t* pu16Response,          
00370                                         uint8_t u8Size,                  
00371                                         const uint8_t cu8Accel);
00372 /*
00373  ******************************************************************************
00374  *
00375  * Function:          u8fnMMA6800ResponseAnalysis()
00376  *
00377  */
00388 static uint8_t u8fnMMA6800ResponseAnalysis(uint16_t u16RawResponse);
00389 /*
00390  ******************************************************************************
00391  *
00392  * Function:          u8fnMMA6800ErrorResponseAnalysis()
00393  *
00394  */
00404 static uint8_t u8fnMMA6800ErrorResponseAnalysis(const uint16_t cu16ReceivedWord);
00405 /*
00406  ******************************************************************************
00407  *
00408  * Function:          u16fnMMA6800AddParityToCommand()
00409  *
00410  */
00418 static uint16_t u16fnMMA6800AddParityToCommand(uint16_t u16RawCommand);
00419 /*
00420  ******************************************************************************
00421  *
00422  * Function:          u8fnMMA6800BatchOp()
00423  *
00424  */
00440 uint8_t u8fnMMA6800BatchOp(const uint8_t cu8DSPIInstance,        \
00441                            const uint8_t cu8ChipSelect,          \
00442                            const uint16_t* pu16DataToSend,       \
00443                            uint16_t* pu16UnfilteredDataReceived, \
00444                            uint8_t u8Size);
00445 /*
00446  ******************************************************************************
00447  *
00448  * Function:          u8fnMMA6800ScheduleBatchOp()
00449  *
00450  */
00464 uint8_t u8fnMMA6800ScheduledBatchOp(const uint8_t cu8DSPIInstance, 
00465                                     const uint8_t cu8ChipSelect,   
00466                                     const uint16_t* pu16DataToSend,
00467                                     uint16_t* pu16UnfilteredDataReceived, uint8_t u8Size);
00468 
00469 #endif /* _FILENAME_H */